#ifndef _NGX_EXCEPTION_H_
#define _NGX_EXCEPTION_H_


#include <exception>
#include <string>
#include "NgxInclude.hpp"


class NgxException final : public std::exception
{
public:
	using string = std::string;
private:
	ngx_int_t code_;
	string msg_;
public:
	NgxException(ngx_int_t code, string msg) : code_(code), msg_(std::move(msg))
	{}
	NgxException(ngx_int_t code = NGX_ERROR) : NgxException(code, "")
    {}

    NgxException(string msg) : NgxException(NGX_ERROR, msg)
    {}

    virtual ~NgxException() noexcept
    {}

public:
	static void raise(ngx_int_t rc = NGX_ERROR, string msg = "")
    {
        throw NgxException(rc, msg);
    }

    static void require(bool cond, ngx_int_t e = NGX_ERROR, string msg = "")
    {
        if(!cond)
        {
            raise(e, msg);
        }
    }

    static void require(ngx_int_t rc, ngx_int_t x = NGX_OK, string msg = "")
    {
        require(rc == x, rc, msg);
    }

    template<typename T>
    static void require(T* p, ngx_int_t e = NGX_ERROR, string msg = "")
    {
        require(p != nullptr, e, msg);
    }

    static void fail(bool cond, ngx_int_t e = NGX_ERROR, string msg = "")
    {
        if(cond)
        {
            raise(e, msg);
        }
    }
};


#endif